/**
 * @file power_ctrl.h
 * @brief 底盘功率控制模块头文件，定义功率相关数据结构、宏定义及函数接口
 * @author WeiFan Qiu (qiuweifan0523@faxmail.com)
 * @version 1.0
 * @date 2025-08-08
 * 
 * @copyright Copyright (c) 2025  邱伟凡
 * 
 * @par 修改日志:
 *   - 2025-08-08: 初始版本创建
 * @bug 待解决问题:
 *   - 功率模型切换逻辑优化
 */
#ifndef __CHASSIS_POWER_CONTROL_H
#define __CHASSIS_POWER_CONTROL_H
#include "stdint.h"
#include "QWF_Include.h"
#include "QWF_Cmd.h"
#include "pid.h"
/*修改层*/
#define power_elec_header	0x001  ///< 超电通信协议头标识
#define use_power_model_gangke	0  ///< '港科'功率模型
#define use_power_model_liwupu	1  ///< '利物浦'功率模型
#define use_power_model		use_power_model_liwupu  ///< 当前使用的功率模型（根据实际需求选择）
/*类型层*/
/*超电*/
typedef	struct{
	/*收到的原始数据*/
	uint16_t bat_v;    ///< 电池电压（单位：mV）
	uint16_t cap_v;    ///< 电容电压（单位：mV）
	int16_t bat_i;     ///< 电池电流（单位：mA，负表示放电）
	int16_t cap_i;     ///< 电容电流（单位：mA）
	/*处理后的计算值*/
	float bat_p;       ///< 电池功率（单位：W）
	float cap_p;       ///< 电容功率（单位：W）
	float all_p;       ///< 总功率（电池+电容，单位：W）
	uint8_t persent;   ///< 电容电量百分比（0-100）
}__attribute__((packed))cap_rx_t;  ///< 超电接收数据结构体
typedef struct{
	_Bool use;          ///< 超电启用标志（true:启用，false:禁用）
	struct{
		uint16_t PowerLimint;  ///< 裁判系统下发的功率限制值（单位：W）
		uint8_t  data[2];      ///< 发送数据缓冲区
	}tx;                  ///< 超电发送数据结构体
	cap_rx_t rx;          ///< 超电接收数据（来自裁判系统）
	int16_t lose_time;    ///< 超电数据丢失计时（超时则标记数据失效）
}super_elec_t;  ///< 超电管理结构体
/*功率控制*/
typedef struct{//单个电机的功率计算
	/*功率估算参数*/
	float w;             ///< 电机角速度（单位：rpm）
#if use_power_model==use_power_model_gangke
	float t;             ///< 电机扭矩（单位：N·m）
	float k_w;           ///< 角速度相关系数
	float k_t2;          ///< 扭矩平方相关系数
#elif use_power_model==use_power_model_liwupu
	float k_it_w;        ///< 电流积分与角速度乘积系数
	float k_w2;          ///< 角速度平方系数
	float it;            ///< 电流积分值
	float k_it2;         ///< 电流积分平方系数
#endif
	float k_0;           ///< 基础功率系数
	float p;             ///< 计算出的电机功率（单位：W）
	/*功率限幅参数*/
	pid_t* pid;          ///< 功率PID控制器指针
	float t_out;         ///< PID输出扭矩限制值
	float p_max;         ///< 电机最大允许功率（单位：W）
	float derta;         ///< 功率调整增量
	float a,b,c;         ///< 功率分配多项式系数
}motor_power_ctrl_t;  ///< 单个电机功率控制结构体
typedef struct {//整个底盘的功率计算
	float p_max;
	motor_power_ctrl_t motor_power_ctrl[chassis_wheel_num];
	float p_all;
	float my_k_p_max;//舵轮分配最大值	
	float p_6020;
	float p_c620;
#if use_power_model==use_power_model_gangke
	float err_all;	
	float p_all_with_sign;	
	float E_upper;//计算置信度时大于这个值为1
	float E_lower;//计算置信度时小于这个值为0
	float k_coe;//置信度
#endif	
}chassis_power_ctrl_t;		
/*功率计*/
typedef struct{
	float v;
	float i;
	float p;
}power_get_t;
/*应用层*/
/*变量*/
extern super_elec_t *super_elec;  ///< 超电管理实例指针（全局访问接口）
extern chassis_power_ctrl_t *chassis_power_ctrl;  ///< 底盘整体功率控制实例指针（全局访问接口）
extern power_get_t* power_get;  ///< 功率计数据实例指针（全局访问接口）
/*函数*/
void super_elec_tx_func(void);  ///< 超电数据发送函数（向裁判系统发送控制指令）
void super_elec_rx_func(uint8_t* data);  ///< 超电数据接收处理函数（解析裁判系统返回数据）

void Chassis_Power_Control(void);
void power_get_func(uint8_t* data);//id0x213
#endif
